home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / lib / yotpin / src / rakepen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-20  |  4.6 KB  |  199 lines

  1. /*
  2. *    Yamana's Otomeza Plug-in Tool
  3. *        熊手ペン
  4. *    
  5. *    1995.07.10    乙女座対応版
  6. *    1995.07.23    画面外への対処、マウス範囲の表示等
  7. *    1995.08.03    マウスを乗っ取らないようにした。高速化。
  8. *    1995.08.07    マスク部分の動作を設定できるようにした
  9. *    
  10. */
  11. #include    "otome_pi.h"
  12.  
  13. const char longname[] = "PEN   : 熊手ペン";
  14. int            cnfg_max = 3;
  15. PI_CNFG        cnfg[] = {
  16.                 {"熊手の数"            , 1, 16,  4,  4 },
  17.                 {"熊手の大きさ"        , 2, 32, 12, 12 },
  18.                 {"マスク→散らない"    , 0,  1,  0,  0 },
  19.             };
  20.  
  21. #define    USE_ENV        PI_SET_ENV
  22. #define    USE_TYPE    PI_DRAW_DOT
  23. #define    USE_PEN        PI_USER_PEN
  24.  
  25. #include    "otome_pi.c"
  26.  
  27. /*******************************************************/
  28.  
  29. int Bit[] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
  30.  
  31. /* 描画可能のとき !0 を返す */
  32. int     getMaskBit( _x, _y)
  33. int     _x,_y;
  34. {
  35.     return (pi_imge->edit[ (_x>>3) + _y*(pi_imge->size.x>>3) ]
  36.                     & Bit[ _x & 7] );
  37. }
  38.  
  39.  
  40. void    chgFunc16( x1,y1,x2,y2 ,mode)
  41. int     x1,y1,x2,y2,mode;
  42. {
  43.     int col1 = (pi_imge->image[ (x1>>1) + y1*(pi_imge->size.x>>1) ]
  44.                     >>((x1 & 1)? 4:0))& 0x0f ;
  45.     int col2 = (pi_imge->image[ (x2>>1) + y2*(pi_imge->size.x>>1) ]
  46.                     >>((x2 & 1)? 4:0))& 0x0f ;
  47.     char    *p;
  48.     
  49.     if( mode == 0 )
  50.     {
  51.         if( getMaskBit(x2,y2) )
  52.         {    p = &( pi_imge->image[ (x2>>1) + y2*(pi_imge->size.x>>1)] );
  53.             
  54.             if( x2 & 1 )    *p = (*p & 0x0f) | ((col1<<4)& 0xf0);
  55.                     else    *p = (*p & 0xf0) | ((col1   )& 0x0f);
  56.         }
  57.         if( getMaskBit(x1,y1) )
  58.         {    p = &( pi_imge->image[ (x1>>1) + y1*(pi_imge->size.x>>1)] );
  59.         
  60.             if( x1 & 1 )    *p = (*p & 0x0f) | ((col2<<4)& 0xf0);
  61.                     else    *p = (*p & 0xf0) | ((col2   )& 0x0f);
  62.         }
  63.     }
  64.     else    /* 共にマスク外 */
  65.     {    if( getMaskBit(x1,y1) && getMaskBit(x2,y2) )
  66.         {    p = &( pi_imge->image[ (x2>>1) + y2*(pi_imge->size.x>>1)] );
  67.             
  68.             if( x2 & 1 )    *p = (*p & 0x0f) | ((col1<<4)& 0xf0);
  69.                     else    *p = (*p & 0xf0) | ((col1   )& 0x0f);
  70.             
  71.             p = &( pi_imge->image[ (x1>>1) + y1*(pi_imge->size.x>>1)] );
  72.             
  73.             if( x1 & 1 )    *p = (*p & 0x0f) | ((col2<<4)& 0xf0);
  74.                     else    *p = (*p & 0xf0) | ((col2   )& 0x0f);
  75.         }
  76.     }
  77. }
  78.  
  79. void    chgFunc256( x1,y1,x2,y2 ,mode)
  80. int     x1,y1,x2,y2,mode;
  81. {
  82.     int     col1 = (pi_imge->image[ x1 + y1*(pi_imge->size.x) ])& 0xff ;
  83.     int     col2 = (pi_imge->image[ x2 + y2*(pi_imge->size.x) ])& 0xff ;
  84.     
  85.     if( mode==0 )
  86.     {    
  87.         if( getMaskBit(x2,y2) )
  88.             pi_imge->image[ x2 + y2*(pi_imge->size.x) ] = col1;
  89.         if( getMaskBit(x1,y1) )
  90.             pi_imge->image[ x1 + y1*(pi_imge->size.x) ] = col2;
  91.     }
  92.     else
  93.     {    if( getMaskBit(x1,y1) && getMaskBit(x2,y2) )
  94.         {    pi_imge->image[ x2 + y2*(pi_imge->size.x) ] = col1;
  95.             pi_imge->image[ x1 + y1*(pi_imge->size.x) ] = col2;
  96.         }
  97.     }
  98. }
  99.  
  100. void    chgFunc32K( x1,y1,x2,y2 ,mode)
  101. int     x1,y1,x2,y2,mode;
  102. {
  103.     char    *p1 = &( pi_imge->image[(x1<<1) + y1*(pi_imge->size.x<<1)] );
  104.     char    *p2 = &( pi_imge->image[(x2<<1) + y2*(pi_imge->size.x<<1)] );
  105.     char    tmp[2];
  106.     
  107.     tmp[0] = *p2,    tmp[1] = *(p2+1);
  108.     
  109.     if( mode==0 )
  110.     {    if( getMaskBit(x2,y2) )
  111.             *p2 = *p1,        *(p2+1) = *(p1+1);
  112.         if( getMaskBit(x1,y1) )
  113.             *p1 = tmp[0],    *(p1+1) = tmp[1];
  114.     }else
  115.     {    if( getMaskBit(x1,y1) && getMaskBit(x2,y2) )
  116.         {    *p2 = *p1,        *(p2+1) = *(p1+1);
  117.             *p1 = tmp[0],    *(p1+1) = tmp[1];
  118.         }
  119.     }
  120. }
  121.  
  122. #if 0
  123. void    chg_point( x1,y1,x2,y2)
  124. int     x1,y1,x2,y2;
  125. {
  126.     int     col;
  127.     PSET    pset;
  128.     pset.n = 1;
  129.     
  130.     EGB_point( EgbPtr, 0, x1,y1, &col );
  131.     EGB_color( EgbPtr, 0, col );
  132.     EGB_point( EgbPtr, 0, x2,y2, &col );
  133.     pset.x = x2;
  134.     pset.y = y2;
  135.     EGB_pset( EgbPtr, &pset );
  136.     
  137.     EGB_color( EgbPtr, 0, col );
  138.     pset.x = x1;
  139.     pset.y = y1;
  140.     EGB_pset( EgbPtr, &pset );
  141.     
  142. }
  143. #endif
  144.  
  145. /*******************************************************/
  146.  
  147. int APL_exec()
  148. {
  149.     int     i;
  150.     int        val,size,mode;
  151.     int     x,y,x1,y1,x2,y2,xs,ys,dx,dy;
  152.     void     (*chgFunc)();
  153.     
  154.     val  = cnfg[0].val * 2;
  155.     size = cnfg[1].val;
  156.     mode = cnfg[2].val;
  157.     
  158.     if( pi_imge->pix  < 8 )    chgFunc = chgFunc16;
  159.     if( pi_imge->pix == 8 )    chgFunc = chgFunc256;
  160.     if( pi_imge->pix  > 8 )    chgFunc = chgFunc32K;
  161.     
  162.     {
  163.         xs= ys = size;
  164.         x = WORD( g_para+2 ) - size/2 ;
  165.         y = WORD( g_para+4 ) - size/2 ;
  166.         
  167.         /* 画面外にならないようチェック */
  168.         if( x < 0 )
  169.             dx=(-x),x+=dx,xs-=dx;
  170.         else if( (dx=( x+size - pi_imge->size.x )) > 0 )
  171.             xs -= dx;
  172.         if( y < 0 )
  173.             dy=(-y),y+=dy,ys-=dy;
  174.         else if( (dy=( y+size - pi_imge->size.y )) > 0 )
  175.             ys -= dy;
  176.         
  177.         srand( (unsigned int)clock() );
  178.         for( i=0; i<val ; i++ )
  179.         {
  180.             x1 = x + (rand() % xs+1);
  181.             y1 = y + (rand() % ys+1);
  182.             x2 = x + (rand() % xs  );
  183.             y2 = y + (rand() % ys  );
  184.             
  185. //            chg_point( x1,y1,x2,y2 );
  186.             chgFunc( x1,y1,x2,y2, mode );
  187.         }
  188.         
  189.     }
  190.     
  191.     ret_fr->lupx = x;
  192.     ret_fr->lupy = y;
  193.     ret_fr->rdwx = x+size-1;
  194.     ret_fr->rdwy = y+size-1;
  195.     
  196.     return NOERR;
  197. }
  198.  
  199.